/**
 * 画布
 * 坦克
 */
import AbstractCanvas from "./abstract/AbstractCanvas";
import ModelTank from "../model/Tank";
import config from "../config";
import position from "../service/position";

/**
 * 画布是单例模式
 * 在一个图层，所以只需要new一个实例即可。
 */
export default new (class extends AbstractCanvas implements ICanvas {
    // 敌方坦克运动定时器
    intervalId: number = 0;

    render(): void {
        // super：调用父类的方法
        this.createModels()
        // 调用渲染模型，防止每次重新渲染时，又生成新的模型实例
        super.renderModels();
        console.log("tank", Number((100 / config.tank.speed).toFixed(3)))
        // 让坦克画布实时刷新，每config.tank.speed毫秒擦写一次，等于速度。
        this.intervalId = setInterval(() => {
            this.renderModels()
        }, Number((100 / config.tank.speed).toFixed(3)))
    }

    //停止，停止移动
    stop() {
        clearInterval(this.intervalId)
    }

    // 抽象方法，返回模型
    model(): ConstructorModel {
        return ModelTank;
    }

    // 抽象方法：返回模型数量
    num(): number {
        return config.tank.num
    }

    // 重写父类方法
    // 绘制模型,生成模型实例，只负责创建实例
    createModels() {
        for (let i = 0; i < this.num(); i++) {
            const pos = position.position()
            const model = this.model()
            //Y轴永远从0开始
            const instance = new model(pos.x, 0)
            this.models.push(instance)
        }
    }

    // 画布渲染模型（将模型渲染到画布上）
    public renderModels() {
        // 调用渲染模型，防止每次重新渲染时，又生成新的模型实例
        super.renderModels();

    }
})('tank')
